﻿namespace _4._3._1_虚方法
{
    internal class Program
    {
        static void Main()
        {
            A a = new A(); // 实例化a对象,A是a的实例类
            A b = new B(); // 实例化b对象,B是b的实例类
            A c = new C(); // 实例化b对象,C是b的实例类
            A d = new D(); // 实例化b对象,D是b的实例类

            Console.Write("A.FUNC:   "); a.Func();    // 执行a.Func：1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类A，就为本身 4.执行实例类A中的方法 5.输出结果 Func In A
            Console.Write("B.FUNC:   "); b.Func();    // 执行b.Func：1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类B，有重载的 4.执行实例类B中的方法 5.输出结果 Func In B
          Console.Write("C.FUNC:   ");  c.Func(); // 执行c.Func：1.先检查申明类A
                      // 2.检查到是虚拟方法
                      // 3.转去检查实例类C，无重载的
                      // 4.转去检查类C的父类B，有重载的
                      // 5.执行父类B中的Func方法
                      // 5.输出结果 Func In B
            

            d.Func();    // 执行d.Func：1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类D，无重载的（这个地方要注意了，虽然D里有实现Func()，但没有使用override关键字，所以不会被认为是重载） 4.转去检查类D的父类A，就为本身 5.执行父类A中的Func方法 5.输出结果 Func In A
            D d1 = new D();
            d1.Func(); // 执行D类里的Func()，输出结果 Func In D

          
            Console.ReadLine();
        }
    }
}
